/*********************************************************************************
 *      Copyright:  (C) 2015 songyong<handy_skyoutlook.com>
 *                  All rights reserved.
 *
 *       Filename:  tty.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2015年08月10日)
 *         Author:  sky <handy_sky@outlook.com>
 *      ChangeLog:  1, Release initial version on "2015年08月10日 14时55分13秒"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

#define GPS_LEN 512
/********************************************************************************
 *  Description:
 *   Input Args:
 *  Output Args:
 * Return Value:
 ********************************************************************************/
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
    struct termios newtio,oldtio;
    if( tcgetattr( fd,&oldtio)  !=  0)
    {
        perror("SetupSerial 1");
        return -1;
    }

    bzero( &newtio, sizeof( newtio ) );
    newtio.c_cflag  |=  CLOCAL | CREAD;
    newtio.c_cflag &= ~CSIZE;

    switch( nBits )
    {
        case 7:
            newtio.c_cflag |= CS7;
            break;
        case 8:
            newtio.c_cflag |= CS8;
            break;
    }

    switch( nEvent )
    {
        case 'O':
            newtio.c_cflag |= PARENB;
            newtio.c_cflag |= PARODD;
            newtio.c_iflag |= (INPCK | ISTRIP);
            break;
        case 'E': 
            newtio.c_iflag |= (INPCK | ISTRIP);
            newtio.c_cflag |= PARENB;
            newtio.c_cflag &= ~PARODD;
            break;
        case 'N':
            newtio.c_cflag &= ~PARENB;
            break;
    }

    switch( nSpeed )
    {
        case 2400:
            cfsetispeed(&newtio, B2400);
            cfsetospeed(&newtio, B2400);
            break;
        case 4800:
            cfsetispeed(&newtio, B4800);
            cfsetospeed(&newtio, B4800);
            break;
        case 9600:
            cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
            break;
        case 115200:
            cfsetispeed(&newtio, B115200);
            cfsetospeed(&newtio, B115200);
        default:
            cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
            break;
    }

    if( nStop == 1 )
    {
        newtio.c_cflag &=  ~CSTOPB;
    }
    else if ( nStop == 2 )
    {
        newtio.c_cflag |=  CSTOPB;
    }

     newtio.c_cc[VTIME] = 0;
     newtio.c_cc[VMIN] = 0;
     tcflush(fd,TCIFLUSH);
     if((tcsetattr(fd,TCSANOW,&newtio))!=0)
     {
         perror("com set error");
         return -1;
     }
     return 0;
}

int open_port(char *console_name)
{
    int fd;
    if(0 >(fd = open(console_name,O_RDWR|O_NOCTTY|O_NDELAY)))
    {           
            printf("fd = %d\n",fd);
            printf("Fail:");
    }           
    printf("Open Comport...");
    return fd; 
}
#if 0
int main (int argc, char **argv)
{
    int fd;    
    int rread,i;
    char buffer[GPS_LEN];
    char *console_name="/dev/ttyS1";

    printf("will open comport\n");
    fd = open_port(console_name);
    printf("Open comport is OK!\n");

    if (( i=set_opt( fd,4800,8,'N',1)) < 0) 
    {          
        perror("set_opt error");
        return -1;
    }             

    printf("Begin to Receive GPS data...\n");
    while(1)  
    {
    rread = read( fd, buffer, sizeof(buffer));
    if( rread > 0)
     {                        
        printf("============================= GPS data ==============================\n");
        printf("===========rread = %d\n,%s\n",rread,buffer);
     }
        sleep(1);
    }
    close(fd);
    return 0;
} /* ----- End of main() ----- */
#endif



